/**
 *    Copyright ${license.git.copyrightYears} the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.mybatis.generator.api.dom.java;

/**
 * @author Jeff Butler
 * 
 */
public class PrimitiveTypeWrapper extends FullyQualifiedJavaType {
  private static PrimitiveTypeWrapper booleanInstance;
  private static PrimitiveTypeWrapper byteInstance;
  private static PrimitiveTypeWrapper characterInstance;
  private static PrimitiveTypeWrapper doubleInstance;
  private static PrimitiveTypeWrapper floatInstance;
  private static PrimitiveTypeWrapper integerInstance;
  private static PrimitiveTypeWrapper longInstance;
  private static PrimitiveTypeWrapper shortInstance;

  private String toPrimitiveMethod;

  /**
   * Use the static getXXXInstance methods to gain access to one of the type wrappers.
   * 
   * @param fullyQualifiedName
   *          fully qualified name of the wrapper type
   * @param toPrimitiveMethod
   *          the method that returns the wrapped primitive
   */
  private PrimitiveTypeWrapper(String fullyQualifiedName, String toPrimitiveMethod) {
    super(fullyQualifiedName);
    this.toPrimitiveMethod = toPrimitiveMethod;
  }

  public String getToPrimitiveMethod() {
    return toPrimitiveMethod;
  }

  public static PrimitiveTypeWrapper getBooleanInstance() {
    if (booleanInstance == null) {
      booleanInstance = new PrimitiveTypeWrapper("java.lang.Boolean", //$NON-NLS-1$
          "booleanValue()"); //$NON-NLS-1$
    }

    return booleanInstance;
  }

  public static PrimitiveTypeWrapper getByteInstance() {
    if (byteInstance == null) {
      byteInstance = new PrimitiveTypeWrapper("java.lang.Byte", //$NON-NLS-1$
          "byteValue()"); //$NON-NLS-1$
    }

    return byteInstance;
  }

  public static PrimitiveTypeWrapper getCharacterInstance() {
    if (characterInstance == null) {
      characterInstance = new PrimitiveTypeWrapper("java.lang.Character", //$NON-NLS-1$
          "charValue()"); //$NON-NLS-1$
    }

    return characterInstance;
  }

  public static PrimitiveTypeWrapper getDoubleInstance() {
    if (doubleInstance == null) {
      doubleInstance = new PrimitiveTypeWrapper("java.lang.Double", //$NON-NLS-1$
          "doubleValue()"); //$NON-NLS-1$
    }

    return doubleInstance;
  }

  public static PrimitiveTypeWrapper getFloatInstance() {
    if (floatInstance == null) {
      floatInstance = new PrimitiveTypeWrapper("java.lang.Float", //$NON-NLS-1$
          "floatValue()"); //$NON-NLS-1$
    }

    return floatInstance;
  }

  public static PrimitiveTypeWrapper getIntegerInstance() {
    if (integerInstance == null) {
      integerInstance = new PrimitiveTypeWrapper("java.lang.Integer", //$NON-NLS-1$
          "intValue()"); //$NON-NLS-1$
    }

    return integerInstance;
  }

  public static PrimitiveTypeWrapper getLongInstance() {
    if (longInstance == null) {
      longInstance = new PrimitiveTypeWrapper("java.lang.Long", //$NON-NLS-1$
          "longValue()"); //$NON-NLS-1$
    }

    return longInstance;
  }

  public static PrimitiveTypeWrapper getShortInstance() {
    if (shortInstance == null) {
      shortInstance = new PrimitiveTypeWrapper("java.lang.Short", //$NON-NLS-1$
          "shortValue()"); //$NON-NLS-1$
    }

    return shortInstance;
  }
}
